﻿using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
using InnvoiceActual.Logica.GestorDB;
using InnvoiceActual.Logica.GestorObject.Articulo;
using InnvoiceActual.Ws.Clientes.Reportes;
using InnvoiceActual.Logica.GestorObject;

namespace InnvoiceActual.Ws.Articulos.Categorias
{
    /// <summary>
    /// Lógica de interacción para MostrarCategoria.xaml
    /// </summary>
    public partial class MostrarCategoria : Window
    {

        #region Property

        //Variables
        List<CategoriaArticulo> categoriasActivas = new List<CategoriaArticulo>();
        List<CategoriaArticulo> categoriasDesactivadas = new List<CategoriaArticulo>();

        private CategoriaArticulo itemSeleccionado = new CategoriaArticulo();
        private int indexSeleccionado = -1;

        string textHelpDefault = "Pulse una opcion";

        //Bases de Datos
        ArticuloDB articuloDB = new ArticuloDB();
        EmpresaCS empresa = EmpresaCS.Instance;

        public delegate void EnviarCategoria(CategoriaArticulo sender);

        public EnviarCategoria enviarCategoria;

        private bool buscandoCategoria = false; //Utilizada cuando se utiliza la ventana para elegir la Categoria

        #endregion

        #region Constructor

        public MostrarCategoria()
        {
            buscandoCategoria = false;
            InitializeComponent();
        }

        public MostrarCategoria(int valorObsoleto)
        {
            buscandoCategoria = true;
            InitializeComponent();
        }

        #endregion

        #region Methods Windows

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            CargarCategorias();
        }

        private void Window_Activated(object sender, System.EventArgs e)
        {
            CargarCategorias();
        }

        private void btnAgregar_Click(object sender, RoutedEventArgs e)
        {
            AgregarElemento();
        }

        private void categoriaDataGridActivas_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            CargarCampos_A_Modificar();
        }

        private void descripcionValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "RETURN":
                    ActualizarItem();
                    Limpiar_y_DesactivarCampos();
                    break;
                default:
                    return;
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F1":
                    AgregarElemento();
                    break;
                case "F2":
                    DesactivarElemento();
                    break;
                case "F3":
                    Listar();
                    break;
                case "F12":
                    this.Close();
                    break;
                case "ESCAPE":
                    Regresar();
                    break;
                default:
                    return;
            }
        }

        private void btnCerarVentana_Click(object sender, RoutedEventArgs e)
        {
            Regresar();
        }

        private void btnDesactivar_Click(object sender, RoutedEventArgs e)
        {
            DesactivarElemento();
        }

        private void categoriaDataGridDesactivadas_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            ActivarElemento();
        }

        #endregion

        #region Auxiliar Methods

        private void CargarCategorias()
        {
            categoriasActivas = articuloDB.ObtenerCategoriasDeArticulosSegunEstado(1);
            categoriasDesactivadas = articuloDB.ObtenerCategoriasDeArticulosSegunEstado(0);

            categoriaDataGridActivas.ItemsSource = categoriasActivas;
            categoriaDataGridActivas.Items.Refresh();

            categoriaDataGridDesactivadas.ItemsSource = categoriasDesactivadas;
            categoriaDataGridDesactivadas.Items.Refresh();
        }

        private void AgregarElemento()
        {
            AltaCategoria altaCategoria = new AltaCategoria();
            altaCategoria.Show();
        }

        private void CargarCampos_A_Modificar()
        {
            itemSeleccionado = (CategoriaArticulo)categoriaDataGridActivas.SelectedItem;
            indexSeleccionado = categoriaDataGridActivas.Items.IndexOf(itemSeleccionado);

            if (!itemSeleccionado.Equals(null) && indexSeleccionado > -1)
            {
                this.descripcionValue.Text = itemSeleccionado.Descripcion;
                this.descripcionValue.IsEnabled = true;
            }
        }

        private void ActualizarItem()
        {

            itemSeleccionado.Descripcion = descripcionValue.Text;
            articuloDB.UpdateCategoriaArticulo(itemSeleccionado, false);

            ActualizarListas();
        }

        private void Limpiar_y_DesactivarCampos()
        {
            descripcionValue.Text = "";
            descripcionValue.IsEnabled = false;
        }

        //Borra el elemento seleccionado
        private void DesactivarElemento()
        {
            if (categoriaDataGridActivas.SelectedItems.Count == 1)
            {
                CategoriaArticulo auxCategoria = (CategoriaArticulo)categoriaDataGridActivas.SelectedItem;
                CategoriaArticulo categoria = articuloDB.ObtenerCategoriaDeArticulos(auxCategoria.Codigo);

                List<Articulo> articulosDeLaCategoria = articuloDB.ObtenerArticulos(auxCategoria.Codigo);

                int cantidadArticulos = articulosDeLaCategoria.Count;

                string resultadoParaMessageBoxInicial = "Realmente desea desactivar la Categoria " + categoria.Descripcion + " ?\n";

                string resultadoMessageBoxFinal = resultadoParaMessageBoxInicial;

                if (cantidadArticulos > 0)
                {
                    string resultadoParaMessageBox = "";
                    int contador = 1;
                    foreach (Articulo item in articulosDeLaCategoria)
                    {
                        resultadoParaMessageBox = resultadoParaMessageBox + contador + " --> " + item.Descripcion + " \n";
                        contador++;
                    }
                    resultadoParaMessageBox = resultadoParaMessageBox + "\n";

                    resultadoMessageBoxFinal = resultadoMessageBoxFinal + "No estaran disponibles los siguientes Articulos (ni lo Sub Articulos que estos contengan)  si desactiva la Categoria: " + categoria.Descripcion + "\n" + resultadoParaMessageBox;
                }

                MessageBoxResult resultadoOK = MessageBox.Show(resultadoMessageBoxFinal, "Desactivar Categoria de los Articulos", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);

                switch (resultadoOK.ToString())
                {
                    case "Yes":
                        articuloDB.DesactivarCategoriaArticulo(categoria);
                        break;
                    default:
                        return;
                }
            }
            else if (categoriaDataGridActivas.SelectedItems.Count < 1)
            {
                MessageBox.Show("Seleccione el elemento a desactivar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                MessageBox.Show("Debe seleccionar SOLO UNA Categoria a desactivar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            ActualizarListas();
            Limpiar_y_DesactivarCampos();
        }

        private void ActivarElemento()
        {
            CategoriaArticulo auxCategoria = (CategoriaArticulo)categoriaDataGridDesactivadas.SelectedItem;
            CategoriaArticulo categoria = articuloDB.ObtenerCategoriaDeArticulos(auxCategoria.Codigo);

            List<Articulo> articulosDeLaCategoria = articuloDB.ObtenerArticulos(auxCategoria.Codigo);

            int cantidadArticulos = articulosDeLaCategoria.Count;

            string resultadoParaMessageBoxInicial = "Realmente desea ACTIVAR la Categoria " + categoria.Descripcion + " ?\n";

            string resultadoMessageBoxFinal = resultadoParaMessageBoxInicial;

            if (cantidadArticulos > 0)
            {
                string resultadoParaMessageBox = "";
                int contador = 1;
                foreach (Articulo item in articulosDeLaCategoria)
                {
                    resultadoParaMessageBox = resultadoParaMessageBox + contador + " --> " + item.Descripcion + " \n";
                    contador++;
                }
                resultadoParaMessageBox = resultadoParaMessageBox + "\n";

                resultadoMessageBoxFinal = resultadoMessageBoxFinal + "Estaran disponibles los siguientes Articulos (y los Sub Articulos que estos contengan)  si ACTIVA la Categoria: " + categoria.Descripcion + "\n" + resultadoParaMessageBox;
            }

            MessageBoxResult resultadoOK = MessageBox.Show(resultadoMessageBoxFinal, "Activar Categoria de los Articulos", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);

            switch (resultadoOK.ToString())
            {
                case "Yes":
                    articuloDB.ActivarCategoriaArticulo(categoria);
                    break;
                default:
                    return;
            }
            ActualizarListas();
            Limpiar_y_DesactivarCampos();
        }

        private void ActualizarListas()
        {
            categoriaDataGridActivas.ItemsSource = articuloDB.ObtenerCategoriasDeArticulosSegunEstado(1);
            categoriaDataGridActivas.Items.Refresh();

            categoriaDataGridDesactivadas.ItemsSource = articuloDB.ObtenerCategoriasDeArticulosSegunEstado(0);
            categoriaDataGridDesactivadas.Items.Refresh();
        }

        private void Listar()
        {
            string miRdlc = "InnvoiceActual.Ws.Articulos.Reportes.ReportCategoria.rdlc";
            string miNameDataSet = "DataSetCategoria";
            List<CategoriaArticulo> listaCategorias = articuloDB.ObtenerCategoriasDeArticulos();
            FReporte rp = new FReporte(listaCategorias, miRdlc, miNameDataSet);
            rp.Show();
        }

        public void Regresar()
        {
            if ((categoriaDataGridActivas.SelectedIndex >= 0) && (categoriaDataGridActivas.Items.Count >= 0) && buscandoCategoria)
                enviarCategoria(categoriasActivas[categoriaDataGridActivas.SelectedIndex]);
            this.Close();
        }
        #endregion
    }
}